const jwt = require('jsonwebtoken');
const config = require('../config');
const _array = require('lodash/array');
const APIError = require('../rest_api').APIError;
const {UserModel} = require('../db/index');

module.exports = {
    // 验证是否登录
    /**
     * @isinfo = true 时返回若token验证成功则返回token对应用户信息
     * @roleName 为验证是否为此角色，验证角色时isinfo必须为true 需要传入数组
     * @isoneself 为验证是否为此传入id（是否为作者），验证角色时isinfo必须为true 需要传入数组
     *
     * 在验证角色和登陆者本人时会返回一个isoneself字段为true时代表是自己false为不是自己
     */
    isLogin: async (token, isinfo = false, roleName = false, isoneself = false) => {
        try {
            let info;
            // 验证token
            let data = await jwt.verify(token, config.secret);

            if (isinfo) {
                console.log('返回token所属用户信息');
                const needKey = {
                    username: 1,
                    cname: 1,
                    createDate: 1,
                    role: 1,
                    headImg: 1
                };
                let user = await UserModel.findOne({token}, needKey).populate({
                    path: 'role',
                    select: '_id name'
                });
                user.roleNames = []; // 登录者对应的角色
                for (let i of user.role) {
                    user.roleNames.push(i.name);
                }

                // 判断是否为登录者本人
                if (isoneself && isoneself !== user.id) {
                    user.isoneself = true; // 是否为登录者本人
                    info = user;
                    console.log('当前信息为登录者本人所有');
                } else {
                    user.isoneself = false; // 是否为登录者本人
                    // 判断是否存在拥有角色
                    if (roleName && _array.intersection(user.roleNames, roleName).length === 0) {
                        console.log(`当前登录者不是${roleName.join()}`);
                        await Promise.reject({
                            code: 'internal:role_error',
                            message: `当前用户不是${roleName.join()}，无权操作`
                        });
                    }
                }
                info = user;
            } else {
                info = data;
            }
            return info;
        } catch (error) {
            console.log('token验证失败：', error);
            if (error.code === 'internal:role_error') {
                await Promise.reject({
                    code: error.code,
                    message: error.message
                });
            } else {
                await Promise.reject({
                    code: 'internal:token_error',
                    message: 'Token过期'
                });
            }
        }
    }
};
